import { createI18n } from 'vue-i18n';
import pinia from '@/store/index';
import { storeToRefs } from 'pinia';
import { Page } from '@/store/page';
import { Local } from '@/utils/storage';
import { Locale } from '@nutui/nutui';
import enUS from '@nutui/nutui/dist/packages/locale/lang/en-US';
import zhCh from '@nutui/nutui/dist/packages/locale/lang/zh-CN';
import viVN from '@/languages/lang/nutui/vi-VN';

// 定义语言国际化内容
const langPathArray = ['activity', 'wallet', 'route', 'proxy', 'level', 'lang', 'home', 'cocos', 'club', 'chatRoom', 'recentWin']

/**
 * 说明：
 * 须在 pages 下新建文件夹（建议 `要国际化界面目录` 与 `i18n 目录` 相同，方便查找），
 * 注意国际化定义的字段，不要与原有的定义字段相同。
 * 1、/src/i18n/lang 下的 ts 为框架的国际化内容
 * 2、/src/i18n/pages 下的 ts 为各界面的国际化内容
 */
// 读取 pinia 默认语言
const page = Page(pinia);
const { lang } = storeToRefs(page);
let itemize: any = { 'en-US': {}, 'zh-CN': {}, 'vi-VN': {} };
try {
	itemize = JSON.parse(sessionStorage.getItem('global_itemize') || "{ 'en-US': {}, 'zh-CN': {}, 'vi-VN': {} }")
} catch {
	itemize = { 'en-US': {}, 'zh-CN': {}, 'vi-VN': {} }
}
// 使用 glob 动态导入多个模块
const modulesGlob = import.meta.glob('./**/*.ts');

// 导出语言国际化
// https://vue-i18n.intlify.dev/guide/essentials/fallback.html#explicit-fallback-with-one-locale
export const i18n: any = createI18n({
	legacy: false,
	silentTranslationWarn: true,
	missingWarn: false,
	silentFallbackWarn: true,
	fallbackWarn: false,
	locale: '',
	messages: itemize,
});



// 动态导入语言文件
let loaded: any = [] // 已经导入过的本地模块
try {
	loaded = JSON.parse(sessionStorage.getItem('global_langs') || "[]")
} catch {
	loaded = []
}
const loadLanguage = async (lang: string) => {
	if (!loaded.includes(lang)) {
		page.setLangLoading(true)
		// 存储动态导入的模块
		const modules: Record<string, any> = {};
		// 获取所有模块路径
		const modulePaths = langPathArray.map((item: string) => {
			return `./${item}/${lang}.ts`
		})
		// 动态导入每个模块
		async function loadModules() {
			for (const path of modulePaths) {
				const module = await modulesGlob[path]();
				modules[path] = module; // 存储模块
			}
		}
		await loadModules()
		loaded.push(lang)
		for (const path in modules) {
			Object.assign(itemize[lang], modules[path].default)
		}
		i18n.global.mergeLocaleMessage(lang, itemize[lang])
		setTimeout(() => {
			sessionStorage.setItem('global_langs', JSON.stringify(loaded))
			sessionStorage.setItem('global_itemize', JSON.stringify(itemize))
			i18n.global.locale.value = ''
		}, 0)
	}

	setTimeout(() => {
		i18n.global.locale.value = lang
		page.setLangLoading(false)
	}, 100)
}


// 设置语言
export const setLanguage = (l?: string, isFirst?: any) => {
	const language = l || Local.get('lang') || lang.value || navigator.language
	const langObj: any = {
		'en': 'en-US',
		'en-US': 'en-US',
		'en-AU': 'en-US',
		'en-GB': 'en-US',
		'zh': 'zh-CN',
		'zh-CN': 'zh-CN',
		'vi-VN': 'vi-VN',
	}
	const curr = langObj[language] || 'vi-VN'
	if (isFirst) {
		loadLanguage(curr)
	}
	i18n.global.locale.value = curr
	Local.set('lang', curr)
	page.setLang(curr)
	// UI框架的多语言
	const langObj2: any = {
		'en-US': enUS,
		'zh-CN': zhCh,
		'vi-VN': viVN
	}
	Locale.use(curr, langObj2[curr]);
}
setLanguage('', true)
